import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import util.ShiroUtils;

/**
 * @author dayu
 * @create 2018/12/11 14:45
 * @Description 数据库带盐认证, 需要配置的地方：
 * 1、数据库表添加，
 * 2、shiro.ini文件中配置数据源 dataSource
 * 3、启用salt加密，需要自定义jdbcRealm继承JdbcRealm，在自定义的类中设置setSaltStyle(SaltStyle.COLUMN);表示启用盐加密
 * 4、在数据库自定义的用户角色权限表于shiro默认的表结构不同时，需要自定义查询语句：
 * a、authenticationQuery 查询数据库账号密码，和盐值，第二个参数表示盐
 * b、userRolesQuery 查询用户角色
 * c、permissionsQuery 查询用户权限
 * 5、涉及到查询权限，需要开启配置：permissionsLookupEnabled=true，设置为true之后才会执行权限查询语句
 * 6、在判断账号密码是否匹配的时候，还需要配置一下账号密码匹配器HashedCredentialsMatcher，
 * 可以在里面指定算法(hashAlgorithmName)
 * ，迭代次数(hashIterations)
 * ，编码方式(storedCredentialsHexEncoded)默认true 16进制编码，false表示base64编码
 * 7、将密码匹配器HashedCredentialsMatcher注入到jdbcRealm中
 * 8、将jdbcRealm注入到securityManager中
 */
public class Shiro4 {
    public static void main(String[] args) {

        Subject subject = ShiroUtils.getSubject("classpath:shiro4/shiro.ini");
//        UsernamePasswordToken token = new UsernamePasswordToken("admin", "123");
        UsernamePasswordToken token = new UsernamePasswordToken("admin", "123");

        ShiroUtils.userLogin(subject, token);

        boolean teacher = subject.hasRole("student");
        System.out.println(teacher);

        boolean permitted = subject.isPermitted("student:insert");
        boolean permitted2 = subject.isPermitted("book:view");
        boolean permitted3 = subject.isPermitted("teacher:insert");
        System.out.println(permitted + ",permission2=" + permitted2);
        System.out.println("permission3=" + permitted3);


        subject.logout();
    }


}
